#ifndef MPHTTPRESPONSEMESSAGE_H
#define MPHTTPRESPONSEMESSAGE_H

/******************************
 *
 * 名   称：   HttpResponseMessage 响应类
 * 用   途：   定义Http响应相关的属性 [ HTTP协议版本、HTTP状态码、HTTP短语、HTTP连接ID、响应体 ] 与方法。
 * 作用范围：   公共的
 * 创建时间：   2022-10-03
 * 备   注：   1. 代码中包括 HttpResponseContent 响应体的相关定义。HttpResponseContent 与 HttpResponseMessage 属于聚合关系，
 *            2. HttpResponseContent 具有 HttpResponseStreamContent、HttpResponseStringContent和HttpResponseFileContent三个派生类，分别对应请求体内容为字符串、流以及表单的三种情况。
 *            3. HttpResponseMessage 响应类和 HttpResponseContent 及其派生类建议均通过代码中定义的CreateXXXX相关函数创建，不要自行实例化
 * 参考：
 *
 ******************************/

#include <string>
#include <memory>
#include <functional>

#include "mpHttpDefines.h"
#include "mpHttpHeaders.h"

namespace MP{
namespace HTTP{

/*****************************************
 * HttpResponseContent
 *****************************************/

class HttpResponseContent
{
public:
    using ptr_s = std::shared_ptr<HttpResponseContent>;

    virtual ~HttpResponseContent() = default;
public:

    virtual void setContentLength(std::size_t httpcontent_length);      //设置Body大小
    virtual std::size_t getContentLength() const;                       //获取Body大小

    virtual void setContentType(const std::string & content_type);      //设置ContentType
    const std::string& getContentType() const;                          //获取ContentType

    virtual std::string getData() const;

    virtual bool isHttpResponseFileContent();

    virtual void beginReadData() = 0;
    virtual void onReadDataSome(const char* data, std::size_t length) = 0;
    virtual void endReadData() = 0;

private:
    std::string _httpcontent_type = {};             //数据类型
    std::size_t _httpcontent_length;                //数据大小
};  //HttpResponseContent



/*****************************************
 * HttpResponseMessage
 *****************************************/

class HttpResponseMessage
{
public:
    using ptr_s = std::shared_ptr<HttpResponseMessage>;
    virtual ~HttpResponseMessage() = default;
public:
    //设置HTTP连接的唯一ID
    virtual void setConnectionId(const std::string & connectionId)  = 0;
    //获取HTTP连接的唯一ID
    virtual const std::string& getConnectionId() const  = 0;
    //获取HTTP协议版本
    virtual const std::string& getHttpVersion() const  = 0;
    //获取收到的HTTP响应代码
    virtual int getResponseCode() const  = 0;
    //检查收到的HTTP响应代码是否代表请求成功
    virtual bool checkResponseCodeIsSuccess() = 0;
    //获取服务器与状态代码一起发送的原因短语
    virtual  const std::string& getReasonPhrase() const  = 0;
    //指示HTTP响应是否成功(不仅收到的HTTP响应代码代表请求成功，而且数据读取完成，即：HTTP_SEND_STATU_CODE=OK)
    virtual bool isSuccess() const  = 0;
    //是否使用的HTTP1.0协议
    virtual bool isHttpVersion_1_0() const  = 0;
    virtual HTTP_SEND_STATU_CODE getSendStatuCode() const  = 0;
    virtual void setSendStatuCode(HTTP_SEND_STATU_CODE sendStatuCode)  = 0;
    virtual void setReadStatus(const std::string & http_version,
                               unsigned int responseCode,
                               const std::string & reasonPhrase)  = 0;

    //关于 HttpRequestHeaders
    virtual HttpResponseHeaders& getHttpResponseHeaders()  = 0;
    //关于 HttpResponseContent
    virtual HttpResponseContent::ptr_s getHttpResponseContent() const = 0;

};  //HttpResponseMessage



//展示请求进度（step = 1 connect ；step = 2 writeData ；step = 3 readData ；）
using func_send_progress_callback = std::function<void(std::size_t step,std::size_t current,std::size_t total)>;
//异步请求完成
using func_send_complete_callback = std::function<void(HttpResponseMessage::ptr_s httpResponseMessage)>;


//创建HttpRequestMessage
HttpResponseMessage::ptr_s createHttpResponseMessage();
HttpResponseMessage::ptr_s createHttpResponseStreamMessage(std::stringstream& sstream);
HttpResponseMessage::ptr_s createHttpResponseFileMessage(const std::string& filePath,
                                                         std::size_t fileOffset = 0);
}   //HTTP
}   //MP



#endif // MPHTTPRESPONSEMESSAGE_H
